-- Version: 0.1.0$
require "sprites"
require "theme"

graph = {
	-- Инициализация
	init = function ()
		graph.window = {
			w = theme.get 'scr.w';
			h = theme.get 'scr.h';
		}
	end;
	
	-- Фрейм объекта
	frame = function (f, spr)
		f.sw, f.sh = sprite.size (spr)
		
		if not f.fx then f.fx = 0 end
		if not f.fy then f.fy = 0 end
		if not f.fw then f.fw = f.sw end
		if not f.fh then f.fh = f.sh end
		
		f.shift = function (x, y, loop)
			f.fx = f.fx + x
			f.fy = f.fy + y
			
			if loop then
				if f.fx >= f.sw then f.fx = 0 end
				if f.fy >= f.sh then f.fy = 0 end
			end
		end
		
		f.get_frame = function ()
			return f.fx, f.fy, f.fw, f.fh
		end
		
		return f
	end;
	
	-- Класс обьекта
	-- Описывает вид и поведение спрайта
	object = function (o)
		-- Входящие параметы
		if not o.spr then
			error('В конструктор обьекта не передан спрайт', 2)
		else
			o.spr = sprite.load (o.spr)
		end
		
		if not o.frame then
			o.frame = graph.frame ({}, o.spr)
		else
			o.frame = graph.frame (o.frame, o.spr)
		end
		
		if not o.alpha then o.alpha = undef end
		
		-- Внутренние параметры
		o.rend_spr = sprite.load ('blank:10x10')
		
		-- Методы
		o.get_sprite = function ()
			return o.rend_spr
		end
		
		o.render = function ()
			local fx, fy, fw, fh = o.frame.get_frame()
			sprite.free(o.rend_spr)
			o.rend_spr = sprite.load ('blank:'..fw..'x'..fh)
			sprite.copy (o.spr, fx, fy, fw, fh, o.rend_spr, 0, 0, o.alpha)
			return o.rend_spr
		end
		
		o.rend_spr = o.render()
		
		return o
	end;
}
